.TH std::ranges::elements_of 3 "2024.06.10" "http://cppreference.com" "C++ Standard Libary"
.SH NAME
std::ranges::elements_of \- std::ranges::elements_of

.SH Synopsis
   Defined in header <ranges>
   template< ranges::range R, class Allocator =
   std::allocator<std::byte> >                                            (since C++23)
   struct elements_of;

   Encapsulates a range. Specializations of elements_of act as a tag in overload sets
   to disambiguate when a range should be treated as a sequence rather than a single
   value.

.SH Template parameters

   R         - a type that satisfies range
   Allocator - an allocator type that meets the requirements of Allocator

   Data members

   Member name Definition
   range       a range of type R
               \fI(public member object)\fP
               an allocator of type Allocator. It has default member initializer that
   allocator   value initializes itself
               \fI(public member object)\fP

   All these members are declared with [[no_unique_address]] attribute.

   Deduction guide

   template< class R, class Allocator = std::allocator<std::byte> >
   elements_of( R&&, Allocator = Allocator() ) -> elements_of<R&&,        (since C++23)
   Allocator>;

.SH Example


// Run this code

 #include <any>
 #include <generator>
 #include <iostream>
 #include <ranges>
 #include <string_view>

 template<bool Elementwise>
 std::generator<std::any> gen(std::ranges::input_range auto&& r)
 {
     if constexpr (Elementwise)
         co_yield std::ranges::elements_of(r); // yield each element of r
     else
         co_yield r;                           // yield r as a single value
 }

 int main()
 {
     auto test = std::string_view{"test"};

     for (std::any a : gen<true>(test))
         std::cout << '[' << std::any_cast<char>(a) << "] ";
     std::cout << '\\n';

     for (std::any a : gen<false>(test))
         std::cout << '[' << std::any_cast<std::string_view>(a) << "] ";
     std::cout << '\\n';
 }

.SH Output:

 [t] [e] [s] [t]
 [test]

.SH References

     * C++23 standard (ISO/IEC 14882:2023):

     * 26.5.6 Class template elements_of [range.elementsof]
